<?php

class Loader extends Base
{
    public static function loadClass($className)
    {
        if(!is_string($className)){
            Sys::app()->error='Имя класса или путь к нему должны быть переданы в виде строки.';
            return false;
        }

        if(class_exists($className)) return new $className();
        $class=ucfirst($className);
        if(class_exists($class)) return new $class();
        $className=str_replace('_',SEP,$className);
        if(!strpos($className,'.php') && strpos($className,BASE_DIR)===false) $className=str_replace('.',SEP,$className);
        if(SEP!='/' && strpos($className,'/')!==false) $className=str_replace('/',SEP,$className);
        if(SEP!='\\' && strpos($className,'\\')!==false) $className=str_replace('\\',SEP,$className);

        if(is_file($className.'.php') || is_file($className)){
            return self::createObject($className);
        }
        if(is_file(SYSTEM.$className.'.php')){
            return self::createObject(SYSTEM.$className);
        }
        if(is_file(APP.$className.'.php')){
            return self::createObject(APP.$className);
        }

        return false;
    }

    protected static function createObject($path=BASE_DIR,$class='')
    {

        if(!$class) $class=self::parsePath($path);
        $class=ucfirst($class);

        if(substr($path,0,1)!==SEP) $path=SEP.$path;
        $file='';

        if(is_file($path)) $file=$path;
        elseif(is_file($path.'.php')) $file=$path.'.php';
        elseif(is_file($path.SEP.$class)) $file=$path.SEP.$class;
        elseif(is_file($path.SEP.$class.'.php')) $file=$path.SEP.$class.'.php';
        elseif(is_file($path.$class)) $file=$path.$class;
        elseif(is_file($path.$class.'.php')) $file=$path.$class.'.php';
        else{
            Sys::app()->error='Нет такого файла '.$file;
            return false;
        }

        require_once($file);
        if(class_exists($class)) return new $class();
        elseif(class_exists($class.'Controller')){
            $class=$class.'Controller';
            return new $class();
        }
        else{
            Sys::app()->error='Нет такого класса '.$class.' в файле '.$file;
            return false;
        }
    }

    public static function loadModel($model)
    {
        if(is_file(MODELS.$model.'.php')){
            require_once(MODELS.$model.'.php');
            if(strpos($model,'/')){
                $pathes=array_filter(explode('/',$model));
                $model=ucfirst(end($pathes));
            }else{
                $model=ucfirst($model);
            }
            if(class_exists($model)) return new $model();
        }
        return false;
    }
}